#ifndef __FIELDNAMELOOKUP_HPP__
#define __FIELDNAMELOOKUP_HPP__

#include <map>
#include <vector>


#include "DataTypes.hpp"

 
class FieldNameLookup 
{
public:
   FieldNameLookup();
public:
   FieldName     StringToFieldName(std::string text);   
   std::string   FieldNameToString(FieldName fieldName);
   FieldNameType FieldNameToFieldNameType(FieldName fieldName);
   std::string   FieldNameTypeToString(FieldNameType fieldNameType);
   void          getFieldNamesWithType(FieldNameType fieldNameType, std::vector<std::string>& vecNames);
   
private:
   void addRelationship(std::string text, FieldName fieldName, FieldNameType fieldNameType = FieldNameType::Unknown);
   void addTypeString(std::string text, FieldNameType fieldNameType);
private: // Maps string -> fieldname
   typedef std::map<std::string, FieldName>  MapStringToFieldName;
   typedef std::pair<std::string, FieldName> MapStringToFieldNamePair;
   MapStringToFieldName mapStringToFieldName;
private: // Maps fieldname -> string
   typedef std::map<FieldName, std::string>  MapFieldNameToString;
   typedef std::pair<FieldName, std::string> MapFieldNameToStringPair;
   MapFieldNameToString mapFieldNameToString;
private: // Maps fieldname -> fieldnametype   
   typedef std::map<FieldName, FieldNameType>  MapFieldNameToFieldNameType;
   typedef std::pair<FieldName, FieldNameType> MapFieldNameToFieldNameTypePair;
   MapFieldNameToFieldNameType mapFieldNameToFieldNameType;
private: // Maps fieldnametype -> string
   typedef std::map<FieldNameType, std::string> MapFieldNameTypeToString;
   typedef std::pair<FieldNameType, std::string> MapFieldNameTypeToStringPair;
   MapFieldNameTypeToString mapFieldNameTypeToString;
  
};


#endif
